<?php
namespace lib;
use lib\Data\DataAccess;

/**
 * 数据模型类的父类，所有的数据模型类要继承此类
 *
 * @package lib
 */
abstract class Model
{
    // 数据持久化访问工具对象实例
    private $dataAccess;

    // 当前数据模型对象要持久化存储的目录名
    protected $dataDirectory = '';

    public function __construct()
    {
        $app = Application::getInstance();
        $this->dataAccess = $app->getObject(DataAccess::class);
        $this->dataAccess->setDataDirectory($this->dataDirectory);
    }

    /**
     * 根据指定的查询条件，获取一个数据对象实例
     *
     * @param $condition array 包含条件组合的数组
     * @return Model 返回查找到的数据信息对象
     */
    public static function find(Array $condition)
    {
        $modelClass = get_called_class();
        $array = (new $modelClass())->dataAccess->find($condition);
        return $modelClass::fromArray($array);
    }

    /**
     * 根据指定的查询条件，获取数据对象集合
     *
     * @param $condition array 包含条件组合的数组
     * @return array 返回查找到的多个数据对象数组
     */
    public static function get(Array $condition = [])
    {
        $modelClass = get_called_class();
        $array = (new $modelClass())->dataAccess->get($condition);
        $objArray = [];
        foreach ($array as $a) {
            $obj = $modelClass::fromArray($a);
            $objArray[] = $obj;
        }
        return $objArray;
    }

    /**
     * 把当前数据对象实例中的数据以文件形式持久化
     */
    public function save()
    {
        $this->dataAccess->save($this->toArray());
    }

    /**
     * 删除指定id的数据
     *
     * @param $id
     */
    public function delete($id)
    {
        $this->dataAccess->delete($id);
    }

    /**
     * 从给定的关联数组，映射出一个当前Model子类对象实例
     *
     * @param array $array
     * @return mixed
     */
    public abstract static function fromArray(Array $array);

    /**
     * 把当前Model子类实例映射成一个关联数组
     *
     * @return array
     */
    public abstract function toArray();
}
